package cn.lili.modules.member.service;

import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.security.token.Token;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.vo.*;
import cn.lili.modules.permission.entity.dos.Role;
import cn.lili.modules.permission.entity.dos.StoreUser;
import cn.lili.modules.system.entity.vo.RegionDetailVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 会员业务层
 *
 * @author Bulbasaur
 * @since 2020-02-25 14:10:16
 */
public interface MemberService extends IService<Member> {

	/**
	 * 获取当前登录的用户信息
	 *
	 * @return 会员信息
	 */
	Member getUserInfo();

	MemberVO getUserInfos(String owner, String username);

	MemberVO getUserInfos(String owner, String username, String exCode);

	MemberVO getUserInfosByMemberId(String owner, String memberName);

	MemberVO findByPhone(QueryWrapper<Member> queryWrapper);

	/**
	 * 是否可以通过手机获取用户
	 *
	 * @param uuid
	 *            UUID
	 * @param mobile
	 *            手机号
	 * @return 操作状态
	 */
	boolean findByMobile(String uuid, String mobile);

	/**
	 * 通过用户名获取用户
	 *
	 * @param username
	 *            用户名
	 * @return 会员信息
	 */
	Member findByUsername(String username);

	List<Role> findRoleById(String id);

	/**
	 * 小程序通过用户名获取用户
	 *
	 * @param username
	 *            用户名
	 * @return 会员信息
	 */
	Member findByUsernameXcx(String username);

	/**
	 * 登录：用户名、密码登录
	 *
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return token
	 */
	Token usernameLogin(String username, String password);

	/**
	 * 商家登录：用户名、密码登录
	 *
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return token
	 */
	Token usernameStoreLogin(String username, String password);

	/**
	 * 注册：手机号、验证码登录
	 *
	 * @param mobilePhone
	 *            手机号
	 * @return token
	 */
	Token mobilePhoneLogin(String mobilePhone);

	/**
	 * 修改会员信息
	 *
	 * @param memberEditDTO
	 *            会员修改信息
	 * @return 修改后的会员
	 */
	Member editOwn(MemberEditDTO memberEditDTO);

	/**
	 * 修改用户密码
	 *
	 * @param confirmPassword
	 *            确认密码
	 * @param newPassword
	 *            新密码
	 * @return 操作结果
	 */
	Member modifyPass(String newPassword, String confirmPassword);

	StoreUser modifyLoginPass(String oldPassword, String newPassword);

	/**
	 * 注册会员
	 *
	 * @param userName
	 *            会员
	 * @param password
	 *            密码
	 * @param mobilePhone
	 *            mobilePhone
	 * @return 处理结果
	 */
	Token register(String userName, String password, String mobilePhone);

	/**
	 * 修改当前会员的手机号
	 *
	 * @param mobile
	 *            手机号
	 * @return 操作结果
	 */
	boolean changeMobile(String mobile);

	/**
	 * 通过手机号修改密码
	 *
	 * @param mobile
	 *            手机号
	 * @param password
	 *            密码
	 * @return
	 */
	boolean resetByMobile(String mobile, String password);

	/**
	 * 后台-添加会员
	 *
	 * @param memberAddDTO
	 *            会员
	 * @return 会员
	 */
	Member addMember(MemberAddDTO memberAddDTO);

	/**
	 * 后台-修改会员
	 *
	 * @param managerMemberEditDTO
	 *            后台修改会员参数
	 * @return 会员
	 */
	Member updateMember(ManagerMemberEditDTO managerMemberEditDTO);

	// 启用/禁用合伙人状态
	Boolean updatePartner(List<String> id, Integer partnerState);

	/**
	 * 获取会员分页
	 *
	 * @param memberSearchVO
	 *            会员搜索VO
	 * @param page
	 *            分页
	 * @return 会员分页
	 */
	IPage<MemberVO> getMemberPage(MemberSearchVO memberSearchVO, PageVO page);
	List<MemberVO> getMemberList(MemberSearchVO memberSearchVO);

	/**
	 * 获取无上级会员分页
	 *
	 * @param memberSearchVO
	 *            会员搜索VO
	 * @param page
	 *            分页
	 * @return 会员分页
	 */
	IPage<MemberVO> noPartnerMemberList(MemberSearchVO memberSearchVO, PageVO page);

	// 获取合伙人分页
	IPage<MemberVO> updatePartner(MemberSearchVO memberSearchVO, PageVO page);
	MemberVO countPartner(MemberSearchVO memberSearchVO);

	// 所有合伙人分页（包含已删除）
	IPage<MemberVO> getPartnerList(MemberSearchVO memberSearchVO, PageVO page);

	// 获取代理商
	IPage<MemberVO> updateAgent(MemberSearchVO memberSearchVO, PageVO page);

	/**
	 * 一键注册会员
	 *
	 * @return
	 */
	Token autoRegister();

	/**
	 * 一键注册会员
	 *
	 * @param authUser
	 *            联合登录用户
	 * @return Token
	 */
	Token autoRegister(ConnectAuthUser authUser);

	/**
	 * 刷新token
	 *
	 * @param refreshToken
	 * @return Token
	 */
	Token refreshToken(String refreshToken);

	/**
	 * 刷新token
	 *
	 * @param refreshToken
	 * @return Token
	 */
	Token refreshStoreToken(String refreshToken);

	/**
	 * 会员积分变动
	 *
	 * @param point
	 *            变动积分
	 * @param type
	 *            是否增加积分 INCREASE 增加 REDUCE 扣减
	 * @param memberId
	 *            会员id
	 * @param content
	 *            变动日志
	 * @return 操作结果
	 */
	Boolean updateMemberPoint(Long point, String type, String memberId, String content);

	/**
	 * 修改会员状态
	 *
	 * @param memberIds
	 *            会员id集合
	 * @param status
	 *            状态
	 * @return 修改结果
	 */
	Boolean updateMemberStatus(List<String> memberIds, Boolean status);

	/**
	 * 根据条件查询会员总数
	 *
	 * @param memberSearchVO
	 * @return 会员总数
	 */
	long getMemberNum(MemberSearchVO memberSearchVO);

	/**
	 * 获取指定会员数据
	 *
	 * @param columns
	 *            指定获取的列
	 * @param memberIds
	 *            会员ids
	 * @return 指定会员数据
	 */
	List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> memberIds);

	/**
	 * 登出
	 *
	 * @param userEnums
	 *            token角色类型
	 */
	void logout(UserEnums userEnums);

	/**
	 * 获取所有会员的手机号
	 *
	 * @return 所有会员的手机号
	 */
	List<String> getAllMemberMobile();

	/**
	 * 清空回收站
	 */
	void cleanMember();

	/**
	 * 获取会员分页
	 *
	 * @param memberStoreVO
	 *            商家关联店铺
	 * @param page
	 *            分页
	 * @return 商家分页
	 */
	IPage<MemberStoreVO> getmemSto(MemberStoreVO memberStoreVO, PageVO page);

	/**
	 * 获取用户合伙人信息
	 */
	MemberPartnerVO getPartner();

	void addPartner(MemberPartnerVO memberPartner);

	Boolean auditPartner(String id, String auditState, String auditRemark);

	Boolean updatePartner(String id, String partnerRegion);

	Member authentication(String realName, String idCardNumber);

	Member authVerify(AuthVerifyDto authVerifyDto);

	/************
	 * 查询登录用户权限******修改计算实际到账金额和手续费************20220623
	 *****************************/
	String findByPartner(String id);

	/******************
	 * 修改计算实际到账金额和手续费************20220623
	 *****************************/

	MemberDetailsVo getMemberDetails(MemberDetailsVo memberDetailsVo);

	/**
	 * 查询收入列表
	 *
	 * @param memberIncomeVo
	 * @param page
	 * @return
	 */
	IPage<MemberIncomeVo> getIncomeByPage(MemberIncomeVo memberIncomeVo, PageVO page);

	/**
	 * 查询收入列表求和
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	Map getIncomeByPageCount(MemberIncomeVo memberIncomeVo);

	/**
	 * 查询支出列表
	 *
	 * @param memberExpenditureVo
	 * @param page
	 * @return
	 */
	IPage<MemberExpenditureVo> getBranchByPage(MemberExpenditureVo memberExpenditureVo, PageVO page);

	/**
	 * 查询支出列表求和
	 *
	 * @param memberExpenditureVo
	 * @return
	 */
	Map getBranchByPageCount(MemberExpenditureVo memberExpenditureVo);

	/**
	 * 设置支付密码
	 *
	 * @param paymentPwdDto
	 * @return
	 */
	Member setPaymentPwd(PaymentPwdDto paymentPwdDto);

	Member initPaymentPwd(PaymentPwdDto paymentPwdDto);

	PaymentPwdVo getPaymentPwd(String memberId);

	/**
	 * 撤销合伙人申请页
	 *
	 * @param memberId
	 * @return
	 */
	RevokePartnerVo revokePartnerPage(String memberId);

	/**
	 * 验证是否存在注销合伙人申请
	 *
	 * @param memberId
	 * @return
	 */
	Boolean revokePartnerVerify(String memberId);

	/**
	 * 撤销合伙人 --申请
	 *
	 * @param revokeMsg
	 *            注销身份说明
	 * @return
	 */
	Boolean applyRevokePartner(String revokeMsg, String memberId);

	/**
	 * 撤销申请详情页
	 *
	 * @param memberId
	 * @return
	 */
	RevokeApplyVo applyRevokePage(String memberId);

	/**
	 * 撤销申请
	 *
	 * @param auditId
	 * @return
	 */
	Boolean applyRevoke(String auditId);

	List<MemberVO> getUserInfoById(List<String> memberIds, List<String> storeIds);

	/**
	 * 获取异常会员会员分页
	 *
	 * @param memberAbnormalVo
	 * @param page
	 *            分页
	 * @return 异常会员分页
	 */
	IPage<MemberAbnormalVo> getDisableMemberPage(MemberAbnormalVo memberAbnormalVo, PageVO page);

	/**
	 * 获取推广会员 天使 事业 B端商家
	 *
	 * @param memberSearchVO
	 * @param page
	 *            分页
	 * @return 异常会员分页
	 */
	IPage<MemberVO> getDisableMemberPageAll(MemberSearchVO memberSearchVO, PageVO page);

	/**
	 * 获取推广会员 城市
	 *
	 * @param memberSearchVO
	 * @param page
	 *            分页
	 * @return 异常会员分页
	 */
	IPage<MemberVO> getDisableMemberPageAll2(MemberSearchVO memberSearchVO, PageVO page);

	/**
	 * 销售钱包收入
	 *
	 * @param memberIncomeVo
	 * @param page
	 * @return
	 */
	IPage<MemberIncomeVo> getIncomeSaleByPage(MemberIncomeVo memberIncomeVo, PageVO page);

	/**
	 * 销售钱包收入汇总
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	Map<String, Object> getIncomeSaleByPageCount(MemberIncomeVo memberIncomeVo);

	/**
	 * 销售钱包支出列表
	 *
	 * @param memberIncomeVo
	 * @param page
	 * @return
	 */
	IPage<MemberExpenditureVo> getBranchSaleByPage(MemberExpenditureVo memberIncomeVo, PageVO page);

	/**
	 * 销售钱包支出汇总
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	Map<String, Object> getBranchSaleByPageCount(MemberExpenditureVo memberIncomeVo);

	/**
	 * 推广钱包收入列表
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	IPage<MemberIncomeVo> getIncomePromoteByPage(MemberIncomeVo memberIncomeVo, PageVO page);

	/**
	 * 推广钱包收入汇总
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	Map<String, Object> getIncomePromoteByPageCount(MemberIncomeVo memberIncomeVo);

	/**
	 * 推广钱包支出列表
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	IPage<MemberExpenditureVo> getBranchPromoteByPage(MemberExpenditureVo memberIncomeVo, PageVO page);

	/**
	 * 推广钱包支出汇总
	 *
	 * @param memberIncomeVo
	 * @return
	 */
	Map<String, Object> getBranchPromoteByPageCount(MemberExpenditureVo memberIncomeVo);

	/**
	 * 根据代理商获取代理商下属推广用户
	 *
	 * @param agentMemberId
	 *            代理商MemberId
	 * @return
	 */
	List<Member> getAgents(String agentMemberId);

	/**
	 * 获取会员分页
	 *
	 * @param memberSearchVO
	 *            会员搜索VO
	 * @param page
	 *            分页
	 * @return 会员分页
	 */
	IPage<MemberVO> getMemberListPage(MemberSearchVO memberSearchVO, PageVO page);

	// 修改区域列表
	IPage<RegionDetailVO> getRegionDetailList(RegionDetailVO regionDetailVO, PageVO page);
}
